import json

from  rest_framework.permissions import BasePermission
from django_redis import get_redis_connection

from ERP_system .settings .dev import *
import re

from ERP_system.utils.cache_permission import redis_storage_permissions


class RbacPermissions(BasePermission):
    def do_url(self,url):

        uri='/'+BASE_API+'/'+url+'/'

        return re.sub('/+','/',uri)

    def has_permission(self, request, view):
        '''

        思路和步骤：
        1.获取请求的url和请求方法method user用户对象

        2.判断是否白名单的url 或者是不是admin

        3从redis中获取当前用户的所有权限

        4.判断是否存在权限
        :param request:
        :param view:
        :return:
        '''

        #获取请求的url和请求的方法以及user用户对象
        request_url=request.path
        request_method=request.method
        user=request.user

        #判断是否请求的url存在白名单中，以及该用户角色是不是admin

        for white_url in WHITE_LIST:
            if re.match(REGEX_URL.format(url=white_url),request_url):
                return True

        role_list=user.roles.values_list('name',flat=True)

        if 'admin' in role_list:
            return True

        #从redis中获取当前用户的权限

        redis_conn=get_redis_connection('default')
        if not redis_conn.exist(f'user_{user.id}'):
            redis_storage_permissions(user)

        url_keys=redis_conn.hkeys(f'user_{user.id}')

        for url_key in url_keys:
            if re.match(REGEX_URL.format(url=self.do_url(url_key.decode())),request_url):
                redis_key=url_key.decode()
                break

        if redis_key:
           permissions=json.loads(redis_conn.hget(f'user_{user.id}',redis_key).decode())
           for permission in permissions:
               if permission.get('method')== request_method:
                   return True
        else:

            return False

